#include "DHT11.h"



void DHT11_Init(void){
    GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_6;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化
}

//获取温湿度
int Get_DHT11_Temperature_Humidity(HT *ht) {
	u8 count = 0;
    u8 dat[5]={0};
    int i,j;
    //主机起始信号::拉低P46信号18~30ms之间 ，典型值20ms
    DHT11 =  0;     //拉低
    oled_delay_ms(20);   //延时
    DHT11 =  1;     //拉高
    //主机释放总线信号::10~15us，典型值13us
    calc_high_low_time(1,10,15,"主机释放总线时间超时::",-1);
    
    //从机响应低电平时间::78~88us，典型值83us
    calc_high_low_time(0,78,88,"从机响应低电平时间超时::",-2);

    //从机响应高电平时间::80~92us，典型值87us
    calc_high_low_time(1,80,92,"从机响应高电平时间超时::",-3);

   //装入数据
    for (i=0;i<5;i++) {
        for (j=0;j<8;j++) {
            //每一位数据的起始低电平信号::50~58us,典型值54us
            calc_high_low_time(0,45,58,"起始位0或1低电平时间超时::",-4);
            //数据位的高电平时间::23~74us
            calc_high_low_time(1,23,74,"数据位的高电平时间超时::",-5);
            if(count>40){
        	dat[i] |= 1<<(7-j);
            }
        }
    }

    //校验数据
    if(dat[0]+dat[1]+dat[2]+dat[3] != dat[4]){
        printf("校验失败\r\n");
        return -6;
    }
    //计算温度,dat[3]是小数位，最高位是1表示零下，最高位是0表示零上
    ht->temp = dat[2]+(dat[3]&0x70)*0.1;
    ht->temp = dat[3]&0x80? -ht->temp : ht->temp;
    //计算湿度
    ht->humi = dat[0]+dat[1]*0.1;
    return 0;
}